Add a way to highlight resizing widgets
authorTimm Bäder <mail@baedert.org>
Thu, 17 Dec 2015 11:34:30 +0000 (12:34 +0100)
committerTimm Bäder <mail@baedert.org>
Fri, 18 Dec 2015 15:20:19 +0000 (16:20 +0100)
https://bugzilla.gnome.org/show_bug.cgi?id=759586

docs/reference/gtk/running.sgml
gtk/gtkdebug.h
gtk/gtkmain.c
gtk/gtkwidget.c
gtk/gtkwidgetprivate.h
gtk/inspector/visual.c
gtk/inspector/visual.ui

index a826dca82804d12d4e8902aac1c983d672e226c2..7f3812046a068fe206c37c2cffdab2d01766b797 100644 (file)
@@ -214,6 +214,10 @@ additional environment variables.
       <term>updates</term>
       <listitem><para>Visual feedback about window updates</para></listitem>
     </varlistentry>
+    <varlistentry>
+      <term>resize</term>
+      <listitem><para>Highlight resizing widgets</para></listitem>
+    </varlistentry>
 
   </variablelist>
   The special value <literal>all</literal> can be used to turn on all
index 40d42d797a6d61991328add57553c1116a1c651c..e78dd6837f3a82439b80e70e0e59123e20fb73e6 100644 (file)
@@ -54,7 +54,8 @@ typedef enum {
   GTK_DEBUG_NO_PIXEL_CACHE  = 1 << 16,
   GTK_DEBUG_INTERACTIVE     = 1 << 17,
   GTK_DEBUG_TOUCHSCREEN     = 1 << 18,
-  GTK_DEBUG_ACTIONS         = 1 << 19
+  GTK_DEBUG_ACTIONS         = 1 << 19,
+  GTK_DEBUG_RESIZE          = 1 << 20
 } GtkDebugFlag;
 
 #ifdef G_ENABLE_DEBUG
index 45134703fb806fd753156051981e10a136ec0b96..36237ae16c3325e5494aaba2991f265f76caf972 100644 (file)
@@ -181,6 +181,7 @@ static const GDebugKey gtk_debug_keys[] = {
   {"interactive", GTK_DEBUG_INTERACTIVE},
   {"touchscreen", GTK_DEBUG_TOUCHSCREEN},
   {"actions", GTK_DEBUG_ACTIONS},
+  {"resize", GTK_DEBUG_RESIZE}
 };
 #endif /* G_ENABLE_DEBUG */
 
index ff7dc0d59f196ced8c10add636ccda062b9313ed..e72b563f817e79521f8fe63a0f451a29fea93897 100644 (file)
@@ -4356,6 +4356,9 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
   priv->alloc_needed = TRUE;
   priv->alloc_needed_on_child = TRUE;
   priv->focus_on_click = TRUE;
+#ifdef G_ENABLE_DEBUG
+  priv->highlight_resize = FALSE;
+#endif
 
   switch (_gtk_widget_get_direction (widget))
     {
@@ -5927,6 +5930,9 @@ gtk_widget_size_allocate_with_baseline (GtkWidget     *widget,
   gtk_widget_push_verify_invariants (widget);
 
 #ifdef G_ENABLE_DEBUG
+  priv->highlight_resize = TRUE;
+  gtk_widget_queue_draw (widget);
+
   if (gtk_widget_get_resize_needed (widget))
     {
       g_warning ("Allocating size to %s %p without calling gtk_widget_get_preferred_width/height(). "
@@ -6978,6 +6984,22 @@ _gtk_widget_draw_internal (GtkWidget *widget,
              cairo_restore (cr);
            }
        }
+
+      if (GTK_DEBUG_CHECK (RESIZE) &&
+          widget->priv->highlight_resize)
+        {
+          GtkAllocation alloc;
+          gtk_widget_get_allocation (widget, &alloc);
+
+          cairo_rectangle (cr, 0, 0, alloc.width, alloc.height);
+          cairo_set_source_rgba (cr, 1, 0, 0, 0.2);
+          cairo_fill (cr);
+
+          gtk_widget_queue_draw (widget);
+
+          widget->priv->highlight_resize = FALSE;
+
+        }
 #endif
 
       if (cairo_status (cr) &&
index e3f8a135deaee165ae2b3f6f208670437388fd01..18bc98030cfd092543a0de1a6c646db194b97d42 100644 (file)
@@ -45,6 +45,10 @@ struct _GtkWidgetPrivate
 
   guint direction             : 2;
 
+#ifdef G_ENABLE_DEBUG
+  guint highlight_resize      : 1;
+#endif
+
   guint in_destruction        : 1;
   guint toplevel              : 1;
   guint anchored              : 1;
index d21a6b7f249c4108085b2ab9ae0bef596f85e854..d96925637dd8e39a22eba3824161569067a70060 100644 (file)
@@ -185,6 +185,19 @@ pixelcache_activate (GtkSwitch *sw)
   redraw_everything ();
 }
 
+static void
+widget_resize_activate (GtkSwitch *sw)
+{
+  guint flags = gtk_get_debug_flags ();
+
+  if (gtk_switch_get_active (sw))
+    flags |= GTK_DEBUG_RESIZE;
+  else
+    flags &= ~GTK_DEBUG_RESIZE;
+
+  gtk_set_debug_flags (flags);
+}
+
 static void
 fill_gtk (const gchar *path,
           GHashTable  *t)
@@ -699,6 +712,7 @@ gtk_inspector_visual_class_init (GtkInspectorVisualClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, rendering_mode_changed);
   gtk_widget_class_bind_template_callback (widget_class, baselines_activate);
   gtk_widget_class_bind_template_callback (widget_class, pixelcache_activate);
+  gtk_widget_class_bind_template_callback (widget_class, widget_resize_activate);
   gtk_widget_class_bind_template_callback (widget_class, software_gl_activate);
   gtk_widget_class_bind_template_callback (widget_class, software_surface_activate);
   gtk_widget_class_bind_template_callback (widget_class, texture_rectangle_activate);
index adb7cf290fb224f7b26418dac6c8c799c0bbcd89..d00fdebc80eec3240c2d5ce60b99c97c8bfe70f2 100644 (file)
                     </child>
                   </object>
                 </child>
+                <child>
+                  <object class="GtkListBoxRow">
+                    <property name="visible">True</property>
+                    <property name="activatable">False</property>
+                    <child>
+                      <object class="GtkBox">
+                        <property name="visible">True</property>
+                        <property name="orientation">horizontal</property>
+                        <property name="margin">10</property>
+                        <property name="spacing">40</property>
+                        <child>
+                          <object class="GtkLabel">
+                            <property name="visible">True</property>
+                            <property name="label" translatable="yes">Show Widget Resizes</property>
+                            <property name="halign">start</property>
+                            <property name="valign">baseline</property>
+                            <property name="xalign">0.0</property>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkSwitch" id="widget_resize_switch">
+                            <property name="visible">True</property>
+                            <property name="halign">end</property>
+                            <property name="valign">baseline</property>
+                            <signal name="notify::active" handler="widget_resize_activate"/>
+                          </object>
+                          <packing>
+                            <property name="expand">True</property>
+                          </packing>
+                        </child>
+                      </object>
+                    </child>
+                  </object>
+                </child>
                 <child>
                   <object class="GtkListBoxRow">
                     <property name="visible">True</property>